home *** CD-ROM | disk | FTP | other *** search
-
- - THE OUTLAW TRIAD DEMO-SERIES -
-
- ───────────────────────────────■ PART XI ■────────────────────────────────────
-
- Written by : Vulture/OT
- Code in : Pascal
- Topics : 3d glenzing, flatshading
-
- ──────────────────────────────■ Introduction ■────────────────────────────────
-
- Welcome to the Outlaw Triad demo-series! In these series we will be talking
- about programming demo-effects in either pascal or assembler. Theory behind
- the effects shall be discussed while a full sourcecode is also provided.
- Right, we will continue our discussions on 3d graphics. This time we'll be
- talking about some relatively simple concepts. 3d glenzing and flatshading!
- These effects are pretty easy to implement if you know your 3d. This doc is
- an add-on to part 10 in which we created a basic 3d engine. Ya really should
- read that text first before reading this. Otherwise you might get a little
- confused. Or maybe not... or maybe you will... naah, enough said... Enjoy!
-
- ─────────────────────────────────■ Theory ■───────────────────────────────────
-
- - GLENZING -
-
- First of all, let me explain what glenzing means. To put it simply, imagine
- a cube made out of colored glass. Whenever you look through a side, you see
- the sides lying behind it. But... in a slightly different color than that
- side really has. Why? Obviously, because the color of the side which you are
- looking through effects the color of the sides behind it.
-
- Ok, with that clear, how do we code this stuff? It's real easy! Here we go:
-
- Most important, in the previous tutorial (on face sorting) we sorted all our
- polygons on their average z value. We don't do this when showing a glenzing
- 3d object because it isn't necessary! It doesn't matter in which order you
- draw the polygons. Ok, as you probably know, a polygon is drawn by drawing
- each horizontal scanline it is consists of. In the previous tutorial (#10)
- we just used one constant color for each polygon. This time, while drawing,
- we don't just put one color of the polygon on the screen but we'll also use
- the background color of the pixel of the current scanline we are plotting.
- So, the algorithm for drawing one pixel of one scanline looks like:
-
- - grab background color
- - add polygon color
- - plot pixel on the screen
- - point to next vga spot
-
- All you have to do is change a few lines of code in your horizontal line
- routine and you're done. Of course this is quite a bit slower than just
- plotting a row of pixels of one constant color.
-
- Ok, here's a part of the horizontal line routine. Examine it. Shouldn't
- be too hard to understand. Of course you have to calculate the exact vga
- position first before using this code. Check the complete source code for
- the total routine.
-
- mov cx,x2
- sub cx,x1 { Calculate # of bytes to draw }
- cmp cx,0
- jle @No_Draw { Quit if no pixels to draw }
- @Draw_Loop:
- mov al,[byte ptr es:di] { Grab background color }
- add al,Color { Add color }
- stosb { And store the byte }
- loop @Draw_Loop
- @No_Draw:
-
- There you go! Easy, eh? First check to see if pixels have to be drawn and
- if so, get the backgroundcolor, add the polygon color and store the byte!
- Do this for all pixels in the horizontal line. That's all! The source code
- is simply the 3d system used in the previous trainer so if you got that one
- already, this should be a breeze.
-
- - FLATSHADING -
-
- Ok, next step in 3d is of course shading of the objects. There are many
- different ways of shading, some of which are very complicated and difficult
- to understand. We will start with the most simple and basic shading method
- around and that's flatshading (also called Lambart shading). What's that?
-
- Imagize a cube rotating in front of the sun. When a face turns towards the
- sun, it will get a brighter color. And when the face turns away from the sun,
- it will get a darker color. Important: the entire face will get another color
- using this method. This is called flatshading and is of course more realistic
- than just having faces with one constant color. The light is coming from the
- viewers side in this example (and in most demos anyway).
-
- How do we code this stuff... Well, there are different ways of implementing
- this effect and I'm going to show the easiest one. We simply use the average
- z-value of the polygon to determine the color of this polygon. If you read
- part 10 of these series, you know we need to determine the drawing order of
- the polygons. This is done by adding the z-values of the 4 3d points of the
- polygons. The resulting values are then sorted and the object is drawn from
- back to front. For a complete explanation, go and read part 10. Anyway, the
- z-values we sorted can also be used to determine the color of the polygons.
- Again, the values in the list are the 4 z-values of each polygon added. The
- resulting values are then sorted from small to large. Now, while drawing,
- grab the z-value of the poly (the absolute z-value) from the list and divide
- this by a certain number to get it into the color range you want (I divided
- the value by 8). This is the color of the face. So, for each frame:
-
- - Rotate polygons
- - Store added z-values
- - Sort polygons on these z-values
- - While drawing:
- - Get absolute z-value from list
- - Divide it by color factor
- - Draw the polygon with resulting color
-
- For example: if I reserved colors 0 - 18 for the shading and the z-value can
- be 280 or less (the 4 z-values of the polygon added), the dividing factor
- should be around 16. Because 280/16=17.5 and that fits into the color range
- we wanted. Before this, you should have setup a nice palette for the shading.
- In the source I used a gray-scale palette. And of course, the more colors you
- use, the more realistic the shading will be.
-
- This method is very easy to implement but it's also the most unrealistic one.
- It's good enough for cubes and other simple objects but for more complicated
- objects you'll need a better method of calculating the color of the polygon.
- Flatshading can also be realised by using face-normals and other complicated
- vector calculations. This method will result in better shading. Hmm, yeah, so
- you would like to know about that too, rite? Be prepared for future trainers
- from OT including textfiles on improved flatshading, gouraud, texture, phong,
- z-buffering and a lot more!
-
- For questions, chatting or for suggestions for future trainers, mail me.
- Ya know where to find me... I'm always in for a chat so don't hesitate to
- contact me (or any other member of OT).
-
- That's all for now. Happy coding!
-
- -Vulture/Outlaw Triad-
-
- ───────────────────────────────■ Distro Sites ■───────────────────────────────
-
- Call our distribution sites! All our releases are available at:
-
- BlueNose World HQ +31 (0)345-619401
- The Force Distrosite +31 (0)36-5346967
- Bugs'R'Us Distrosite +31 (0)252-686092 More distros wanted!
- The 7 Angels Distrosite +31 (0)715-148377 (preferably outside
- ShockWave South African HQ +27 (011)888-6345 of the Netherlands)
- Society HQ United States HQ +1 (518)465-6721
- ACe World Brazilian HQ +55 (21)-259-8847
- Corps Elite Canadian HQ +403 (ITS)-PRIVATE
-
- Also check the major FTP/WWW sites for Outlaw Triad productions.
-
- ──────────────────────────────────■ Contact ■─────────────────────────────────
-
- Want to contact Outlaw Triad for some reason? You can reach us at our
- distrosites in Holland. Or if you have e-mail access, mail us:
-
- Vulture (coder/pr) comma400@tem.nhl.nl
-
- Our internet homepage:
-
- http://www.tem.nhl.nl/~comma400/vulture.html
-
- These internet adresses should be valid at least till june 1997.
-
- ──────────────────────────────────────────────────────────────────────────────
-
- Quote: Toe = part of the foot used to find furniture in the dark